from src.domain.distribution import SharesDistribution
from src.domain.share_type import Cap, Term, Region, ShareType
TOTAL = 1
distribution = SharesDistribution(
by_type=dict(zip((ShareType.Stock, ShareType.Bond), (0.75, 0.25))),
by_region=dict(zip((Region.US, Region.ExUS), (0.7, 0.3))),
by_cap=dict(zip((Cap.Large, Cap.Small), (0.8, 0.2))),
by_term=dict(zip((Term.Long, ), (1, ))),
)
large_us_stocks = {
"VTI": 0.8,
"VNQ (REIT)": 0.2
}
large_exus_stocks = {
"EAFE": 1
}
small_us_stocks = {
"Russell 2000": 1
}
small_exus_stocks = {
"EAFE Small-Cap": 1
}
bonds = {
"BND": 1
}
def assert_shares(obj):
assert sum(obj.values()) == TOTAL
fund_shares = [large_us_stocks, large_exus_stocks, small_us_stocks, small_exus_stocks, bonds]
for shares in [distribution.by_cap, distribution.by_region, distribution.by_term, distribution.by_type] + fund_shares:
assert_shares(shares)
flatten_stock_portfolio = []
stock_share = distribution.by_type[ShareType.Stock]
for (region_key, region_value) in distribution.by_region.items():
for (cap_key, cap_value) in distribution.by_cap.items():
flatten_stock_portfolio.append({
"region": region_key.value,
"share": stock_share * region_value * cap_value,
"cap": cap_key.value
})
def sort_by_share(portfolio):
return sorted(portfolio, key=lambda x: x["share"], reverse=True)
flatten_stock_portfolio = sort_by_share(flatten_stock_portfolio)
import pandas as pd
from IPython.display import display
from src.portfolio import prepare_stock_table_rows, get_stock_name
from src.display.distribution import display_distributions
stocks_table = prepare_stock_table_rows(flatten_stock_portfolio)
df = pd.DataFrame(stocks_table, columns=['Share', 'Share of all'], index=[get_stock_name(x) for x in flatten_stock_portfolio])
display(df)
display_distributions([distribution], ["Portfolio"], fund_shares)
| Share | Share of all | |
|---|---|---|
| Us Large-cap stocks | 56.0% | 42.0% |
| Ex-us Large-cap stocks | 24.0% | 18.0% |
| Us Small-cap stocks | 14.0% | 10.5% |
| Ex-us Small-cap stocks | 6.0% | 4.5% |
| Portfolio | |
|---|---|
| VTI | 33.6% |
| VNQ (REIT) | 8.4% |
| EAFE | 18.0% |
| Russell 2000 | 10.5% |
| EAFE Small-Cap | 4.5% |
| BND | 25.0% |
| Mean ret. | Std | |
|---|---|---|
| Portfolio | 8.56 | 11.08 |